#include <iostream>
#include <pthread.h>
#include <string>
#include <vector>
#include <unistd.h>
#include<cstdio>
#include<cstring>

//创建多线程
int num = 10;

void* routine(void *args)
{
    std::string name = static_cast<const char*>(args);
    delete (char*)args;//申请的空间释放掉

    int cnt = 5;
    while(cnt--)
    {
        std::cout << "new线程的名字: " << name << std::endl;
        sleep(1);
    }

    return nullptr;
}

int main()
{
    std::vector<pthread_t> tids;
    for(int i = 0; i < num; i++)
    {
        pthread_t tid;
        char* id = new char[64];//创建一个新的空间，这样就不会被覆盖
        snprintf(id,sizeof(id),"thread-%d",i);
        int n = pthread_create(&tid,nullptr,routine,id);
        if(n == 0)
            tids.push_back(tid);//保存创建线程的tid
        else 
            continue;
        sleep(1);
    }
    //等待新线程
    for(int i = 0; i < num; i++)
    {
        //一个一个地等待
        int n = pthread_join(tids[i], nullptr);
        if(n == 0)
        {
            std::cout << "等待新线程成功"<<std::endl;
        }
    }
    return 0;
}

// 线程终止绝对不能用exit
// 因为exit是用来终止进程的
// 如果想终止线程，就用pthread_exit()
// class Task
// {
// public:
//     Task(int a, int b) : _a(a), _b(b) {}

//     int Execute()
//     {
//         return _a + _b;
//     }

//     ~Task() {}

// private:
//     int _a;
//     int _b;
// };

// class Result
// {
// public:
//     Result(int result) : _result(result) {}
//     int GetResult() { return _result; }
//     ~Result() {}

// private:
//     int _result;
// };

// void *routine(void *args)
// {
//     pthread_detach(pthread_self());
//     std::cout << "新线程被分离"<<std::endl;
//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << "new线程的名字: " << std::endl;
//         sleep(1);
//     }
//     return nullptr;
//     // Task*t = static_cast<Task*>(args);
//     // sleep(1);
//     // Result* res = new Result(t->Execute());
//     // sleep(1);
//     // //return res;
//     // pthread_exit(res);
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, routine, (void *)"thread-1");

//     // pthread_detach(tid);
//     // std::cout << "新线程被分离" << std::endl;
//     //分离之后会自动释放资源

//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << "main线程的名字: " << std::endl;
//         sleep(1);
//     }

//     int n = pthread_join(tid,nullptr);
//     if(n != 0)
//     {
//         std::cout << "pthread_join error: "<<strerror(n) <<std::endl;
//     }
//     // pthread_t tid;
//     // Task *t = new Task(10,20);
//     // pthread_create(&tid, nullptr, routine, t );

//     // // int cnt = 5;
//     // // while(cnt--)
//     // // {
//     // //     std::cout << "main线程的名字: " << std::endl;
//     // //     sleep(1);
//     // // }

//     // Result* ret = nullptr;
//     // pthread_join(tid, (void**)&ret);
//     // int n = ret->GetResult();

//     // std::cout << "新线程结束，退出码："<<n << std::endl;

//     // delete t;
//     // delete ret;
//     return 0;
// }
